\documentclass[a4paper,10pt]{article}
\usepackage[spanish]{babel} %Paquetes de idioma
\usepackage[latin1]{inputenc} %Paquetes de idioma
\usepackage{graphicx} % Paquete para ingresar gráficos
\usepackage{hyperref}
\usepackage{fancybox}
\usepackage{color}
\usepackage{listings}

%Encabezado y Pié de página
\input{EncabezadoyPie.tex}
%Carátula del Trabajo
\title{ \input{Portada.tex} }

\begin{document}
	\maketitle %Hace que el título anterior sea el principal del documento
	\newpage

	\tableofcontents %Esta línea genera un indice a partir de las secciones y subsecciones creadas en el documento
	\newpage

	\section{Resumen}
		El objetivo del presente trabajo consiste en realizar dos aplicaciones en lenguaje \emph{assembly}, usando como herramientas el set de instrucciones basado en la arquitectura MIPS y el concepto de ABI exhibido por la c\'atedra.
 	
	\section{Introducci\'on Te\'orica}
		\label{sec:InfoTeo}
		El trabajo a desarrollar consta de dos aplicaciones que le permiten al usuario obtener un volcado de caracteres 1 y 0 a partir de una entrada de texto y su operaci\'on inversa, recuperar el texto a partir de una entrada compuesta por 1 y 0. Siendo requerimiento necesario que el c\'odigo sea codificado en lenguaje ensamblador, basado en la arquitectura \emph{MIPS32}, respetando la convenci\'on dada por la ABI previamente mencionada. \\
		\indent Una vez desarrollados ambos programas, se debi\'o recrear las condiciones dadas por un procesador MIPS32. Para lo cu\'al se utiliz\'o un emulador denominado GXemul, que nos permite recrear diferentes arquitecturas, entre las cuales se encuentra MIPS.\\
		\indent A continuaci\'on se provee un breve resumen sobre cada uno de estos conceptos.
		
		\subsection{MIPS (\emph{Microprocessor without Interlocked Pipeline Stages})}
			Se conoce con el nombre MIPS\cite{proc} a una familia de microprocesadores que implementan la arquitectura RISC (\emph{reduced instruction set computer})
			desarrollados por MIPS Technologies\cite{tech}.\\
			\indent Este tipo de procesador se caracteriza por tener un conjunto de instrucciones simples para acceso a memoria \emph{Load/Store}. Presenta 32 registros 
			de 32 bits para el manejo de n\'umeros enteros (\$0 - \$31) y 32 registros de 32 bits para el manejo de n\'umeros en punto flotante.\\
			\indent Los registros para el manejo de n\'umeros enteros son como se muestra en la siguiente tabla:\\[1cm]
			\begin{center}
			\begin{tabular}{|c|c|c|}
				\hline
				\textbf{\normalsize Nombre} & \textbf{\normalsize N\'umero} & \textbf{\normalsize Uso} \\
				\hline
				\normalsize \$zero & \normalsize 0 & \normalsize Constante cero \\
				\hline
				\normalsize \$at & \normalsize 1 & \normalsize  Reservado por el ensamblador\\
				\hline
				\normalsize \$v0 - \$v1 & \normalsize 2 - 3 & \normalsize Evaluaci\'on de expreciones y resultados de una funci\'on \\
				\hline
				\normalsize \$a0 - \$a3 & \normalsize 4 - 7 & \normalsize Argumentos\\
				\hline
				\normalsize \$t0 - \$t7 & \normalsize 8 - 15 & \normalsize Temporales (no necesitan ser preservados)\\
				\hline
				\normalsize \$s0 - \$s7 & \normalsize 16 - 23 & \normalsize Temporales salvados (si necesitan ser preservados)\\
				\hline
				\normalsize \$t8 - \$t9 & \normalsize 24 - 25 & \normalsize Temporales (no necesitan ser preservados)\\
				\hline
				\normalsize \$k0 - \$k1 & \normalsize 26 - 27 & \normalsize Reservados para el Kernell\\
				\hline
				\normalsize \$gp & \normalsize 28 & \normalsize Global Pointer\\
				\hline
				\normalsize \$sp & \normalsize 29 & \normalsize Stack Pointer\\
				\hline
				\normalsize \$fp & \normalsize 30 & \normalsize Frame Pointer\\
				\hline
				\normalsize \$ra & \normalsize 31 & \normalsize Direcci\'on de retorno\\
				\hline
			\end{tabular}
			\end{center}

			\indent Ademas de los anteriormente mencionados, el procesador cuenta con tres registros especiales:
			\begin{itemize}
				\item \textbf{pc}: Program Counter
				\item \textbf{LO}: Registro utilizado para almacenar el resultado en las operaciones de multiplicaci\'on y divisi\'on
				\item \textbf{HI}: Registro utilizado para almacenar el resultado en las operaciones de multiplicaci\'on y divisi\'on
			\end{itemize}
			\indent Todas las instrucciones del set estan formadas por 32 bits, y se pueden clasificar en tres tipos:
			\begin{itemize}
				\item \textbf{Tipo I \emph{Inmediato}}: Presenta 6 bits para indicar el c\'odigo de operaci\'on, 5 bits para indicar el registro fuente, 5 bits
				para indicar el registro destino y 16 bits para indicar un n\'umero inmediato / desplazamiento.
				\item \textbf{Tipo R \emph{Registro}}: Consta de 6 bits para indicar el c\'odigo de operaci\'on, 5 bits para indicar el registro fuente 1, 5 bits
				para indicar el registro fuente 2, 5 bits para indicar el registro destino, 5 bits para indicar desplazamiento y 6 bits para indicar
				el c\'odigo de funci\'on.
				\item \textbf{Tipo J \emph{Jump}}: Esta formada por 6 bits para el c\'odigo de operacion y 26 para indicar la direcci\'on de salto.
			\end{itemize}
			\indent Finalmente, la arquitectura MIPS clasifica a la memoria en 3 sectores:
			\begin{itemize}
				\item \textbf{Segmento de texto}
				\item \textbf{Segmento de datos (\emph{est\'aticos y din\'amicos})}
				\item \textbf{Pila}
			\end{itemize}

		\subsection{ABI (\emph{Application Binary Interface})}
			La ABI es una convenci\'on que describe como debe ser la interface entre aplicaciones, o entre una aplicaci\'on y el sistema operativo. Para 
			el desarrollo del trabajo, se tomo como referencia la ABI dada para el procesador MIPS. Para m\'as informaci\'on sobre la misma se puede
			consultar el documento \emph{System V - Application Binary Interface}\cite{abi}

		\subsection{GXemul}
			Es un emulador gratuito y Open Source que permite correr varias arquitecturas, entre ellas MIPS. Tiene como ventajas que puede correr algunos 
			sistemas operativos sin modificaciones (especialmente \emph{netBSD}), su portabilidad y velocidad de emulaci\'on dado que realiza la 
			traducci\'on binaria en tiempo real. En esta materia utilizaremos el mismo para emular una arquitectura \emph{MIPS 32} y poder compilar el c\'odigo \emph{assembly} desarrollado en este trabajo. 
	
	\section{Desarrollo}
A partir de los conceptos desarrollados en la secci\'on anterior (\ref{sec:InfoTeo}) se procedi\'o a crear la aplicaci\'on, a continuaci\'on se detalla su funcionamiento y ejecuci\'on:

		\subsection{Modo de Operaci\'on}
			Los programas desarrollados se trata de aplicaciones autocontenidas o stand-alone, deben recibir una entrada por la entrada standard y genera una salida por la salida standard. 
		\begin{itemize}
			\item \emph{tp1-encode:} Se trata un programa que genera un volcado de 1s y 0s de la informaci\'on ingresada por stdin.
			\item \emph{tp1-decode:} Es la operaci\'on inversa, calcula el contenido del archivo original a partir de
una secuencia de caracteres 1 y 0. 	
		\end{itemize}

	\section{Implementaci\'on}
	Algunas decisiones que se tomaron en la implementaci\'on fueron:
	\begin{itemize}
		\item Si bien se sale del programa al haber error de escritura o lectura a los streams standard, no se imprime ningun mensaje por pantalla, solo se devuelve el c\'odigo de error en el retorno de la funcion main.
		\item Solo se imprime por stderr mensajes en el caso de que el archivo a decodificar est\'e mal formado, es dec\'ir, que no tenga solo caracteres 0 y 1 o que finalize el archivo de forma inesperada.
	\end{itemize}

	\indent Para desarrollar la apilcaci\'on en assembly se modulariz\'o esta en peque\~nas funciones para que sea mucho mas sencillo llevar el desarrollo a cabo y saber que porci\'on de c\'odigo es la que falla. \\
	\indent A partir de las siguientes funciones se desarrollaron los programas \emph{tp1-encode} y \emph{tp1-decode}
	\begin{itemize}
		\item \emph{size\_t read\_asm(int handle, void *buffer, int nbyte)}: Encapsula el llamado al systemcall read.
		\item \emph{size\_t write\_asm(int handle, void *buffer, int nbyte)}: Encapsula el llamado al systemcall write.
		\item \emph{size\_t encode(char c)}: Genera un volcado de 1 y 0 de un solo char.
		\item \emph{size\_t decode(char *c)}: Genera un char a partir de un buffer de tama\~no 8 le\'ido del volcado binario.
	\end{itemize}
	
\section{Compilaci\'on y Ejecuci\'on}
	\subsection{Compilaci\'on}
		Para compilar el programa se provee en el CD un archivo Makefile para compilarlo. Para esto desde una terminal en el directorio donde se encuetra el archivo Makefile se debe ejecutar el comando:
	\begin{verbatim}
		$ make
	\end{verbatim}
	Esto generara los archivos ejecutables tp1-encode, tp1-decode, tp0 (\'este \'ultimo para usar de referencia en las pruebas).
	\subsection{Ejecuci\'on}
Los dos ejecutables generados se tratan de aplicaciones autocontenidas o stand-alone, que no tienen argumentos definidos por l\'inea de comandos y operan siempre por los streams est\'andar stdin y stdout.
		Para ejecutar los programas, una vez compilado, desde la misma terminal se ejecutan de la siguiente forma:
	\begin{verbatim}
		$ ./tp1-encode < archivo_entrada > volcado_bin
		$ ./tp1-decode < volcado_bin > salida_texto
	\end{verbatim}
\section{Pruebas}
	A continuaci\'on se muestran algunas capturas de pantalla para distintas ejecuciones del programa.
	\begin{itemize}			
		\item Ejecuci\'on de volcado binario.
			\begin{center}
				\includegraphics[width=0.8\textwidth]{tp1_1.png}
			\end{center}
		\item Ejecuci\'on en cadena de volcado binario y tomando el output como input del decode, convertirlo a texto nuevamente.
			\begin{center}
				\includegraphics[width=0.8\textwidth]{tp1_2.png}
			\end{center}
		\item Se compara el volcado binario con referencia al ejecutable del tp0.
			\begin{center}
				\includegraphics[width=0.8\textwidth]{tp1_3.png}
			\end{center}
		\item Se compara la decodificacion del texto con referencia al ejecutable del tp0.
			\begin{center}
				\includegraphics[width=0.8\textwidth]{tp1_4.png}
			\end{center}
		\item Se corre el script de prueba del enunciado.
			\begin{center}
				\includegraphics[width=0.8\textwidth]{tp1_5.png}
			\end{center}
	\end{itemize}

	\subsection{Pruebas Automatizadas}
		En el CD adjunto al Trabajo Pr\'actico donde se entregan los fuentes del ejecutable se proporciona un script que ejecuta test automaticos del programa comparando la salida con la salida del ejecutable del tp0 utilizando el comando \emph{diff}. \\
		El script genera \emph{n} archivos de \emph{b} bytes a partir de /dev/urandom y genera un volcado binario con tp1-encode y el ejecutable del tp0, luego compara ambas salidas con el comando diff. Una vez hecho esto convierte a binario los volcados binario y los compara nuevamente usando diff con los archivos originales.\\
		El script tiene 2 parametros:
		\begin{itemize}
			\item \textbf{-b:} Indica la cantidad de bytes que se usan del archivo /dev/urandom.
			\item \textbf{-n:} Indica la cantidad de loops de ejecuci\'on del script.
		\end{itemize} 
		Un ejemplo de ejecuci\'on del script es:
		\begin{verbatim}
			$ ./test_tp1_6620.sh -b 1024 -n 50
		\end{verbatim}

	\section{Conclusi\'on}
	En el presente trabajo se resolvi\'o un problema piloto planteado en el trabajo pr\'actico anterior pero esta vez implementando la l\'ogica en assembly de MIPS. En este caso desarrollamos la aplicacio\'on respetando la ABI, que es la convencion utilizada por los desarrolladores (y por gcc) para que los programas puedan hacer llamadas a funciones de librerias y no tener ningun problema.
	\indent Tambien pudimos entender mejor el funcionamiento de las llamadas al sistema, en este caso se utilizaron dos llamadas, una para leer (\emph{SYS\_read}) y otra para escribir (\emph{SYS\_write}).

	\newpage
	\section{Ap\'endice}
\subsection{C\'odigo Fuente Assembly MIPS}

\subsubsection{SYScalls.S}
\lstset{
  backgroundcolor=\color{white}, % choose the background color. You must add \usepackage{color}
  showspaces=false,               % show spaces adding particular underscores
  showstringspaces=false,         % underline spaces within strings
  showtabs=false,                 % show tabs within strings adding particular underscores
  tabsize=2,                      % sets default tabsize to 2 spaces
  captionpos=b,                   % sets the caption-position to bottom
  breaklines=true,                % sets automatic line breaking
  breakatwhitespace=true,         % sets if automatic breaks should only happen at whitespace
}
\lstinputlisting{SYScalls.S}

\subsubsection{tp1-encode.S}
\lstset{
  backgroundcolor=\color{white}, % choose the background color. You must add \usepackage{color}
  showspaces=false,               % show spaces adding particular underscores
  showstringspaces=false,         % underline spaces within strings
  showtabs=false,                 % show tabs within strings adding particular underscores
  tabsize=2,                      % sets default tabsize to 2 spaces
  captionpos=b,                   % sets the caption-position to bottom
  breaklines=true,                % sets automatic line breaking
  breakatwhitespace=true,         % sets if automatic breaks should only happen at whitespace
}
\lstinputlisting{tp1-encode.S}

\subsubsection{tp1-decode.S}
\lstset{
  backgroundcolor=\color{white}, % choose the background color. You must add \usepackage{color}
  showspaces=false,               % show spaces adding particular underscores
  showstringspaces=false,         % underline spaces within strings
  showtabs=false,                 % show tabs within strings adding particular underscores
  tabsize=2,                      % sets default tabsize to 2 spaces
  captionpos=b,                   % sets the caption-position to bottom
  breaklines=true,                % sets automatic line breaking
  breakatwhitespace=true,         % sets if automatic breaks should only happen at whitespace
}
\lstinputlisting{tp1-decode.S}

\subsection{Makefile}
\lstset{
  backgroundcolor=\color{white}, % choose the background color. You must add \usepackage{color}
  showspaces=false,               % show spaces adding particular underscores
  showstringspaces=false,         % underline spaces within strings
  showtabs=false,                 % show tabs within strings adding particular underscores
  tabsize=2,                      % sets default tabsize to 2 spaces
  captionpos=b,                   % sets the caption-position to bottom
  breaklines=true,                % sets automatic line breaking
  breakatwhitespace=true,         % sets if automatic breaks should only happen at whitespace
}
\lstinputlisting{Makefile}

\begin{thebibliography}{99}
	\bibitem{proc} Informaci\'on adicional sobre MIPS, http://es.wikipedia.org/wiki/MIPS\_(procesador).
	\bibitem{tech} MIPS Technologies, http://www.mips.com/.
	\bibitem{abi} MIPS ABI, http://refspecs.freestandards.org/elf/mipsabi.pdf/.
\end{thebibliography}

\end{document}


